home *** CD-ROM | disk | FTP | other *** search
/ Light ROM 1 / LIGHT-ROM 1 (Amiga Library Services)(1994).iso / ffdisks / d968.lha / JustLook / Examples / ExampleSources / MasterMind.jl.c < prev    next >
C/C++ Source or Header  |  1993-12-08  |  8KB  |  243 lines

  1. /* MasterMind.jl By Kamran Karimi.
  2.  
  3.    Should be linked with JustLook (© Kamran Karimi) routines.
  4.  
  5.    To use it, first run MasterMind, then this program. Just Look!.
  6.    MasterMind by Kamran Karimi is also available on Fish Disks. 
  7. */
  8.  
  9. #include <stdlib.h>
  10. #include <stdio.h>
  11. #include <intuition/intuition.h>
  12. #include <clib/intuition_protos.h>
  13. #include <clib/exec_protos.h>
  14. #include <clib/dos_protos.h>
  15.  
  16. #include "JustLook.h"
  17.  
  18. #include "MasterMind.jl.h"
  19.  
  20. #define DEBUG
  21. #ifdef DEBUG
  22. #define Write_err if(err) printf("err = %08lx\n",err)
  23. #else
  24. #define Write_err  ;
  25. #endif
  26.  
  27. #define Message Text(JLWindow->RPort,Mess,count2++)
  28.  
  29. struct IntuitionBase *IntuitionBase;
  30.  
  31. struct Window *JLWindow = NULL;
  32. struct Screen *scr = NULL;
  33. struct ScrMap SM; /* global, so that it can be in various routintes */
  34.  
  35. VOID CleanUp(VOID);
  36. VOID Text(struct RastPort *rp,char **TextArray,ULONG Index);
  37. VOID ClearLastLine(struct RastPort *rp);
  38. VOID HandleSolutionWindow(VOID);
  39. VOID HandleCheatWindow(VOID);
  40.  
  41. main()
  42. {
  43.  struct Screen *scr1 = NULL,*scr2 = NULL;
  44.  struct Window *win = NULL;
  45.  ErrorCode err;
  46.  SHORT count,count2 = 0,ShouldClose = FALSE;
  47.  
  48.  IntuitionBase = (struct IntuitionBase *)OpenLibrary("intuition.library",0);
  49.  if(IntuitionBase == 0) exit(100);
  50.  
  51.  scr1 = FindScreen("                             MasterMind V1.6");
  52.  scr2 = FindScreen("                             MasterMind V1.6                     Scrollable");
  53.  if((scr1 > SCR_REPEATED) && (scr2 == NULL) || (scr1 == NULL) && (scr2 > SCR_REPEATED))
  54.  {
  55.   scr = (scr1 > SCR_REPEATED) ? scr1 : scr2;
  56.   if((scr->Width > 640) || (scr->Height > 200) && (scr->Height != 256)) 
  57.    ShouldClose = TRUE;
  58.   win = FindWindow("MasterMind Window",scr);
  59.   if(win > WIN_REPEATED) 
  60.   {
  61.    InitSM(&SM,scr);
  62.    err = IEDisable(MOUSE|KBD); Write_err;
  63.    if((scr->LeftEdge) || (scr->TopEdge)) 
  64.     MoveScreen(scr,-(scr->LeftEdge),-(scr->TopEdge)); /*bring the screen up!*/
  65.    ScreenToFront(scr);
  66.    ActivateWindow(win);
  67.    Delay(30);
  68.    if(FindWindow("Choose!",scr) > WIN_REPEATED) Click(&SM,RBUTTON,0,DOWN_UP);
  69.    HandleCheatWindow();
  70.    HandleSolutionWindow();
  71.    Delay(30);
  72.    JLNewWindow.Screen = scr;
  73.    if(!(JLWindow = OpenWindow(&JLNewWindow))) CleanUp();
  74.    Message; if(IEWait(MOUSE) & RBMASK) CleanUp();/* 1 */ 
  75.    ClearLastLine(JLWindow->RPort);
  76.    err = WinResize(&SM,JLWindow,RELATIVE,-135,-45); Write_err;
  77.    Message; if(IEWait(MOUSE) & RBMASK) CleanUp();/*  2 */
  78.    ClearLastLine(JLWindow->RPort);
  79.    err = ClickGad(&SM,win,NULL,502,1); Write_err; /* clear play board */
  80.    Delay(100); /* give some time to MasterMind to open possible window */
  81.    HandleSolutionWindow(); /* this may show up after 'Abort!' */ 
  82.    if(ShouldClose) 
  83.     MoveWindow(JLWindow,0,scr->Height - JLWindow->TopEdge - 150); 
  84.    Message; if(IEWait(MOUSE) & RBMASK) CleanUp();/* 3 */
  85.    ClearLastLine(JLWindow->RPort);
  86.    err = ClickGad(&SM,win,NULL,503,1); Write_err;/* begin changing configuration */
  87.    Delay(30);
  88.    err = ClickGad(&SM,win,NULL,1000,1); Write_err;/* how many colors to guess? */
  89.     Delay(30);
  90.    err = RawType(RawColum,5,10); Write_err;
  91.    Delay(30);
  92.    err = ClickGad(&SM,win,NULL,1001,1); Write_err; /* among how many colors? */
  93.    Delay(20);
  94.    err = RawType(RawColor,6,10); Write_err; 
  95.    Delay(20);
  96.    err = ClickGad(&SM,win,NULL,1002,1); Write_err; /* how many trials are allowed? */
  97.    Delay(30);
  98.    err = RawType(RawRow,5,10); Write_err;
  99.    Delay(30);
  100.    if(ShouldClose) CloseWindow(JLWindow);
  101.    err = ClickGad(&SM,win,NULL,503,1); Write_err;
  102.    /* now it is possible that the screen has changed! */
  103.    if(ShouldClose) 
  104.    {
  105.     Delay(150); /* this should be enough even for the slowest Amigas! */
  106.     scr = FindScreen("                             MasterMind V1.6");
  107.     win = FindWindow("MasterMind Window",scr);
  108.     InitSM(&SM,scr);
  109.     JLNewWindow.Screen = scr; 
  110.     JLNewWindow.Width = 417;
  111.     JLNewWindow.Height = 75;
  112.     JLNewWindow.LeftEdge = 20;
  113.     JLNewWindow.TopEdge = 15;
  114.     if(!(JLWindow = OpenWindow(&JLNewWindow))) CleanUp();
  115.    }
  116.    Message; if(IEWait(MOUSE) & RBMASK) CleanUp();/*  4 */
  117.    ClearLastLine(JLWindow->RPort);
  118.    for(count = 0;count < 4;count++)
  119.    {
  120.     err = ClickGad(&SM,win,NULL,100 + 2 * count,1); Write_err;
  121.     Delay(30);
  122.     err = ClickGad(&SM,win,NULL,1 + count,1); Write_err; 
  123.     Delay(30);
  124.    }                     /* we did not click the last square! */ 
  125.    Message; if(IEWait(MOUSE) & RBMASK) CleanUp();/*  5 */
  126.    ClearLastLine(JLWindow->RPort);
  127.    err = ClickGad(&SM,win,"<- Done",0,1); Write_err;  
  128.    /* here we got an error from MasterMind */
  129.    /* let us "correct" it as follows: */ 
  130.    Message; if(IEWait(MOUSE) & RBMASK) CleanUp();/*  6 */
  131.    ClearLastLine(JLWindow->RPort);
  132.    err = ClickGad(&SM,win,NULL,1 + 4,1); Write_err;
  133.    Delay(30); /* two repetative colors! */
  134.  
  135.    err = ClickGad(&SM,win,"<- Done",0,1); Write_err;/* try again the Done gadget */
  136.    Delay(30); 
  137.    Message; if(IEWait(MOUSE) & RBMASK) CleanUp();/*  7 */
  138.    ClearLastLine(JLWindow->RPort);
  139.    err = ClickGad(&SM,win,NULL,100 + 4 * 2,1); Write_err; 
  140.    Delay(30);
  141.    err = ClickGad(&SM,win,NULL,1 + 4,1); Write_err; 
  142.    Delay(30);
  143.    Message; if(IEWait(MOUSE) & RBMASK) CleanUp();/*  8 */
  144.    ClearLastLine(JLWindow->RPort);
  145.    err = ClickGad(&SM,win,"<- Done",0,1); Write_err; /* try again the Done gadget */
  146.    Delay(30); 
  147.  
  148.    if(FindGad(win,"   OK   ",0)) /* We Won!!! */
  149.    {
  150.     count2 = 10;
  151.     Message; if(IEWait(MOUSE) & RBMASK) CleanUp();
  152.     ClearLastLine(JLWindow->RPort);
  153.     err = ClickGad(&SM,win,"   OK   ",0,1); 
  154.     Write_err;  Delay(30);
  155.     count2 = 8; 
  156.    }
  157.    Message; if(IEWait(MOUSE) & RBMASK) CleanUp();/*  9 */
  158.    ClearLastLine(JLWindow->RPort);
  159.    err = ClickGad(&SM,win," Cheat! ",0,1); Write_err;
  160.    Delay(30);
  161.    
  162.    HandleCheatWindow();
  163.  
  164.    Message; IEWait(MOUSE); /* 10 */
  165.    CloseWindow(JLWindow);
  166.    err = ClickGad(&SM,win,NULL,502,1);
  167.    Write_err;  Delay(30);
  168.    HandleSolutionWindow();
  169.    Delay(100);
  170.    err = ClickGad(&SM,win,"Quit Game",0,1); /* really DONE! */
  171.    Write_err; 
  172.    err = IEEnable(MOUSE|KBD);
  173.    Write_err;
  174.   }
  175.   else if(win == WIN_REPEATED) 
  176.    printf("Impossible: Two windows with the same name in MasterMind Screen!\n");
  177.   else printf("Impossible: MasterMind window not found!\n");
  178.  }
  179.  else if((scr1 == SCR_REPEATED) || (scr2 == SCR_REPEATED)) 
  180.   printf("you have Two screens with the same name open!\n");
  181.  else if((scr1 == NULL) && (scr2 == NULL))
  182.   printf("you should first run MasterMind, then this program!\n"); 
  183.  CloseLibrary((struct Library *)IntuitionBase);
  184.  exit(0);
  185. }
  186.  
  187. VOID HandleCheatWindow(VOID)
  188. {
  189.  struct Window *win;
  190.  ErrorCode err;
  191.  
  192.  win = FindWindow("Naughty!",scr);
  193.  if(win)
  194.  {
  195.   Delay(50);
  196.   err = WinAct(&SM,win,CLOSEWIN); Write_err;
  197.  }
  198.  
  199. VOID HandleSolutionWindow(VOID)
  200. {
  201.  struct Window *win;
  202.  ErrorCode err;
  203.  
  204.  win = FindWindow("Solution",scr);
  205.  if(win) 
  206.  {
  207.   err = WinDrag(&SM,win,ABSOLUTE,250,30); Write_err; 
  208.   Delay(50);
  209.   err = WinAct(&SM,win,CLOSEWIN); Write_err;
  210.  }
  211. }
  212.  
  213. VOID CleanUp(VOID)
  214. {
  215.  if(JLWindow) CloseWindow(JLWindow);
  216.  IEEnable(MOUSE|KBD);
  217.  CloseLibrary((struct Library *)IntuitionBase);
  218.  exit(0);
  219. }
  220.  
  221. VOID Text(struct RastPort *rp,char **TextArray,ULONG Index)
  222. {
  223.  int count;
  224.  
  225.  for(count = 0;count < 6;count++)
  226.  {
  227.   TextToShow[0].IText = TextToShow[1].IText;
  228.   TextToShow[1].IText = TextToShow[2].IText;
  229.   TextToShow[2].IText = TextToShow[3].IText;
  230.   TextToShow[3].IText = TextToShow[4].IText;
  231.   TextToShow[4].IText = TextToShow[5].IText;
  232.   TextToShow[5].IText = TextArray[Index * 6 + count];
  233.   PrintIText(rp,&TextToShow[5],0,0);
  234.  }
  235. }
  236.  
  237. VOID ClearLastLine(struct RastPort *rp)
  238. {
  239.  PrintIText(rp,&BlankLine,0,0);
  240. }
  241.  
  242.